﻿namespace Trancity
{
    using Common;
    using Microsoft.DirectX;
    using Microsoft.DirectX.Direct3D;
    using System;
    using System.Collections.Generic;
    using System.Drawing;

    public class Сигнальная_система : MeshObject, MeshObject.IFromFile, IMatrixObject
    {
        private int fсостояние;
        public int граница_переключения;
        public List<Элемент> элементы = new List<Элемент>();

        public Сигнальная_система(int граница_переключения, int состояние)
        {
            this.граница_переключения = граница_переключения;
            this.состояние = состояние;
        }

        public override void CreateMesh()
        {
            base.CreateMesh();
            this.Обновить_материалы();
        }

        public Matrix GetMatrix(int index)
        {
            Double3DPoint point = this.координаты_и_направление(index);
            DoublePoint point2 = new DoublePoint(point.x, point.y);
            return (Matrix.RotationY(-((float) point.z)) * Matrix.Translation((float) point2.x, 0f, (float) point2.y));
        }

        public void Добавить_элемент(Элемент элемент)
        {
            this.элементы.Add(элемент);
        }

        public Double3DPoint координаты_и_направление(int index)
        {
            Сигнал сигнал = this.Найти_сигнал(index);
            DoublePoint point = new DoublePoint(0.0, 0.0);
            point = сигнал.дорога.НайтиКоординаты(сигнал.расстояние, -1.4 - (сигнал.дорога.НайтиШирину(сигнал.расстояние) / 2.0));
            return new Double3DPoint(point.x, point.y, сигнал.дорога.НайтиНаправление(сигнал.расстояние));
        }

        private Сигнал Найти_сигнал(int index)
        {
            int num = 0;
            foreach (Элемент элемент in this.элементы)
            {
                if (элемент is Сигнал)
                {
                    if (index == num)
                    {
                        return (Сигнал) элемент;
                    }
                    num++;
                }
            }
            return null;
        }

        private void Обновить_материалы()
        {
            if ((base._meshMaterials != null) && (base._meshMaterials.Length >= 3))
            {
                bool flag = this.сигнал == Сигналы.Зелёный;
                ColorValue emissiveColor = base._meshMaterials[1].EmissiveColor;
                ColorValue value3 = base._meshMaterials[2].EmissiveColor;
                emissiveColor.Green = flag ? ((float) 1) : ((float) 0);
                value3.Red = flag ? ((float) 0) : ((float) 1);
                base._meshMaterials[1].EmissiveColor = emissiveColor;
                base._meshMaterials[2].EmissiveColor = value3;
            }
        }

        public string Filename
        {
            get
            {
                return "сигнал.x";
            }
        }

        public int MatricesCount
        {
            get
            {
                int num = 0;
                foreach (Элемент элемент in this.элементы)
                {
                    if (элемент is Сигнал)
                    {
                        num++;
                    }
                }
                return num;
            }
        }

        public Сигналы сигнал
        {
            get
            {
                if (this.состояние < 0)
                {
                    this.состояние = 0;
                }
                if (this.состояние < this.граница_переключения)
                {
                    return Сигналы.Зелёный;
                }
                return Сигналы.Красный;
            }
        }

        public int состояние
        {
            get
            {
                return this.fсостояние;
            }
            set
            {
                if (value < 0)
                {
                    value = 0;
                }
                bool flag = this.fсостояние < this.граница_переключения;
                bool flag2 = value < this.граница_переключения;
                this.fсостояние = value;
                if (flag != flag2)
                {
                    this.Обновить_материалы();
                }
            }
        }

        public class Контакт : Сигнальная_система.Элемент
        {
            public bool минус;

            public Контакт(Сигнальная_система система, Road дорога, double расстояние, bool минус)
            {
                base.система = система;
                система.Добавить_элемент(this);
                base.дорога = дорога;
                дорога.objects.Add(this);
                base.расстояние = расстояние;
                this.минус = минус;
            }
        }

        public class Сигнал : Сигнальная_система.Элемент
        {
            public Сигнал(Сигнальная_система система, Road дорога, double расстояние)
            {
                base.система = система;
                система.Добавить_элемент(this);
                base.дорога = дорога;
                дорога.objects.Add(this);
                base.расстояние = расстояние;
            }
        }

        public abstract class Элемент
        {
            public Road дорога;
            public double расстояние;
            public Сигнальная_система система;

            protected Элемент()
            {
            }
        }
    }
}

